package com.zzl.cwlyxt.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.zzl.cwlyxt.entity.Adoption;
import com.zzl.cwlyxt.entity.Pets;
import com.zzl.cwlyxt.service.AdoptionService;
import com.zzl.cwlyxt.service.PetsService;
import com.zzl.cwlyxt.util.Result;

import org.springframework.web.bind.annotation.*;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
import java.util.Objects;

/**
 * (Adoption)表控制层
 *
 * @author makejava
 * @since 2024-03-05 17:17:45
 */
@Transactional(rollbackFor = Exception.class)
@RestController
@RequestMapping("adoption")
public class AdoptionController {
    /**
     * 服务对象
     */
    @Resource
    private AdoptionService adoptionService;
    /**
     * 服务对象
     */
    @Resource
    private PetsService petsService;

    /**
     * 分页查询
     *
     * @param adoption 筛选条件
     * @param limit    分页对象
     * @param page     分页对象
     * @return 查询结果
     */
    @GetMapping("findAll")
    public Result findAll(Adoption adoption, Integer limit, Integer page) {
        if (limit == null || page == null) {
            return Result.failure("limit和page不能为空");
        }
        return adoptionService.selectAll(adoption, limit, page);
    }

    /**
     * 通过主键查询单条数据
     *
     * @param id 主键
     * @return 单条数据
     */
    @GetMapping("getById")
    public Result getById(Integer id) {
        return Result.success(this.adoptionService.getById(id));
    }

    /**
     * 新增数据
     *
     * @param adoption 实体
     * @return 新增结果
     */
    @PostMapping("add")
    public Result add(Adoption adoption) {
        //判断是否为空
        if (adoption == null) {
            return Result.failure("参数不能为空");
        }

        //先查询看是否已经申请
        QueryWrapper<Adoption> adoptionQueryWrapper = new QueryWrapper<>();
        adoptionQueryWrapper.eq("petsid", adoption.getPetsid())
        .eq("userid", adoption.getUserid())
                .and(i-> i.eq("status", 1).or().eq("status", 2) );
        if (this.adoptionService.count(adoptionQueryWrapper) > 0) {
            return Result.failure("已经申请过了");
        }

        //保存申请
        adoption.setTime(new Date());
        if (this.adoptionService.save(adoption)) {
            return Result.success("申请成功");
        }
        return Result.failure("申请失败");
    }

    /**
     * 编辑数据
     *
     * @param adoption 实体
     * @return 编辑结果
     */
    @PostMapping("edit")
    public Result edit(Adoption adoption) {
        //判断是否为空
        if (adoption == null) {
            return Result.failure("参数不能为空");
        }

        //获取状态 1待处理、2批准、3拒绝
        Integer status = adoption.getStatus();
        //通过id查询这个申请记录
        Adoption adoptionById = this.adoptionService.getById(adoption.getAdoptionid());
        //获取宠物id
        Integer petsid = adoptionById.getPetsid();
        if (status==2){
            //查询该宠物有没有被领养
            Pets byId = petsService.getById(petsid);
            if (byId.getStatus()==1){
                return Result.failure("该宠物已经被领养了");
            }

            //修改该宠物为已领养状态
            Pets pets = new Pets();
            pets.setPetsid(petsid);
            pets.setStatus(1);
            petsService.updateById(pets);
        }else if (status==3){
            //查询该宠物是否已被领养
            QueryWrapper<Adoption> adoptionQueryWrapper = new QueryWrapper<>();
            adoptionQueryWrapper.eq("petsid", petsid);
            adoptionQueryWrapper.eq("status", 2);
            List<Adoption> list = adoptionService.list(adoptionQueryWrapper);
            if (list.size()>1){
                //如果大于1说明有数据错乱了，修改该宠物的状态为未领养状态
                Pets pets = new Pets();
                pets.setPetsid(petsid);
                pets.setStatus(0);
                petsService.updateById(pets);

                UpdateWrapper<Adoption> adoptionUpdateWrapper = new UpdateWrapper<>();
                adoptionUpdateWrapper.set("status", 3);
                adoptionUpdateWrapper.eq("petsid", petsid);
                adoptionService.update(adoptionUpdateWrapper);

                return Result.success("修改成功");
            }else if (list.size()==1){
                //如果等于1说明该宠物已经被领养了,判断是不是该用户
                if (Objects.equals(list.get(0).getUserid(), adoptionById.getUserid())){
                    //修改该宠物为未领养状态
                    Pets pets = new Pets();
                    pets.setPetsid(petsid);
                    pets.setStatus(0);
                    petsService.updateById(pets);
                }
            }
        }

        //修改申请状态
        if (this.adoptionService.updateById(adoption)) {
            return Result.success("修改成功");
        }
        return Result.failure("修改失败");
    }

    /**
     * 删除数据
     *
     * @param id 主键
     * @return 删除是否成功
     */
    @PostMapping("delete")
    public Result deleteById(Integer id) {
        //判断id是否为空
        if (id == null) {
            return Result.failure("id不能为空");
        }

        if (this.adoptionService.removeById(id)) {
            return Result.success("删除成功");
        }
        return Result.failure("删除失败");
    }

}

